#ifndef RT_IMAGE
#define RT_IMAGE
#include "color.h"
class Image {
	private:
		/** 
		 * largura (width) em pixels
		 */
		  unsigned short width;
		/**
		 * altura (height) em pixels   
		 */
		  unsigned short height; 
		/**
		 * buffer RGB                  
		 */
		  unsigned char  *buf;
		/*  getuint e putuint:
		 * Funcoes auxiliares para ler e escrever inteiros na ordem (lo-hi)
		 * Note que no Windows as variaveis tipo "unsigned short int" sao armazenadas 
		 * no disco em dois bytes na ordem inversa.  Ou seja, o numero 400, 
		 * por exemplo, que pode ser escrito como 0x190, fica armazenado em 
		 * dois bytes consecutivos 0x90 e 0x01. Nos sistemas UNIX e Mac 
		 * este mesmo inteiro seria armazenado na ordem 0x01 e 0x90.  
		 *  O armazenamento do Windows e'  chamado de "little endian"  
		 * (i.e., lowest-order byte stored first), e no sitemas Unix sao
		 * "big-endian" (i.e., highest-order byte stored first). 
		 */  
		static int getuint(unsigned short *uint, FILE *input);
		static int putuint(unsigned short uint, FILE *output);
	public:
		/**
		 *	Cria uma nova imagem com as dimensoes especificadas.
		 *
		 *	@param w Largura da imagem.
		 *	@param h Altura da imagem.
		 *
		 *	@return Handle da imagem criada.
		 */
		Image(int w, int h);
		/*
		 * Libera a memória utilizada pela imagem
		 */
		~Image();

		/**
		 *	Obtem as dimensoes de uma imagem.
		 *
		 *	@param image Handle para uma imagem.
		 *	@param w [out]Retorna a largura da imagem.
		 *	@param h [out]Retorna a altura da imagem.
		 */
		void imageGetDimensions(int *w, int *h);

		/**
		 *	Ajusta o pixel de uma imagem com a cor especificada.
		 *
		 *	@param image Handle para uma imagem.
		 *	@param x Posicao x na imagem.
		 *	@param y Posicao y na imagem.
		 *	@param color Cor do pixel.
		 */
		void imageSetPixel(int x, int y, Color *color);

		/**
		 *	Obtem o pixel de uma imagem na posicao especificada.
		 *
		 *	@param image Handle para uma imagem.
		 *	@param x Posicao x na imagem.
		 *	@param y Posicao y na imagem.
		 *
		 *	@return Pixel da posicao especificada.
		 */
		Color* imageGetPixel(int x, int y);

		/**
		 *	Redimensiona a imagem especificada.
		 *
		 *	@param image Handle para uma imagem.
		 *	@param w1 Nova largura da imagem.
		 *	@param h1 Nova altura da imagem.
		 *  @return imagem criada.
		 */
		void imageResize(int w1, int h1);

		/**
		 *	Le a imagem a partir do arquivo especificado.
		 *
		 *	@param filename Nome do arquivo de imagem.
		 *
		 *	@return imagem criada.
		 */
		void imageLoad(char *filename);

		/**
		 *	Salva a imagem no arquivo especificado em formato TGA.
		 *
		 *	@param filename Nome do arquivo de imagem.
		 *	@param image Handle para uma imagem.
		 *
		 *	@return retorna 1 caso nao haja erros.
		 */
		int imageWriteTGA(char *filename);
		
};

#include "image.cpp"
#endif
